package com.yztctech.a25_03_bindservice;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

/**
 * binService:bindservice使Activity持有了service,进而控制service下的方法
 * 1、 自定义 Service 中，自定义 Binder 类，并在 onBind（）方法中，作为实例返回。一般在 Binder 类中，创建获得 Service 实例的方法，一般操作 Service
 * 2、 在启动 Service 的地方，创建 ServiceConnection 实例,通过里边的binder获取service
 * 3、 调用 bindService(Intent service, ServiceConnection conn, int flags)启动 Service，其中 flags 使用 Context.BIND_AUTO_CREATE 常量。
 * 4、 使用 unbindService(ServiceConnection conn)停止 Service
 * 5. 通过startservice开启的服务.一旦服务开启, 这个服务和开启他的调用者之间就没有任何的关系了.调用者不可以访问 service里面的方法. 调用者如果被系统回收了或者调用了ondestroy方法, service还会继续存在
 * 6. 通过bindService开启的服务,服务开启之后,调用者和服务之间 还存在着联系 ,一旦调用者挂掉了.service也会跟着挂掉 .
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private DownloadService downloadService;

    //ServiceConnection对象;观察者模式,这么一大圈下来,其实就是想持有service的
    private ServiceConnection sconn = new ServiceConnection() {
        //Service连接成功
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.e("Tag", "MainActivity-----------> onServiceConnected");
            //类名.内部类类名 向下转型-->Mybinder对象
            downloadService = ((DownloadService.MyBinder) iBinder).getService();

        }

        //Service断开连接
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e("Tag", "MainActivity-----------> onServiceDisconnected");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("Tag", "MainActivity-------------onCreate");
        initView();
    }

    private void initView() {
        findViewById(R.id.btn_bind).setOnClickListener(this);
        findViewById(R.id.btn_download).setOnClickListener(this);
        findViewById(R.id.btn_unbind).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_bind://绑定Service----->需要三个参数 前两个实例化 第三个直接使用
                Log.e("Tag", "MainActivity-------------onClick:btn_bind");
                Intent intent = new Intent(MainActivity.this, DownloadService.class);
                bindService(intent, sconn, Context.BIND_AUTO_CREATE);
                break;
            case R.id.btn_unbind://解除绑定
                Log.e("Tag", "MainActivity-------------onClick:btn_unbind");
                unbindService(sconn);
                break;
            case R.id.btn_download://持有了service就可以控制里边的任意需求方法了
                Log.e("Tag", "MainActivity-------------onClick:btn_download");
                downloadService.download("http://www.wwww");
                break;
        }
    }
}
